home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / ZAKO01.C < prev    next >
Text File  |  2000-03-20  |  4KB  |  157 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. */
  5. /*直進してから折り返す*/
  6. #include <xsp2lib.h>
  7. #include "../SPASSION.H"
  8. #include "../player.h"
  9. #include "../enemy.h"
  10. #include "../eshot.h"
  11. #include "../effect.h"
  12. #include "../priority.h"
  13. #include "../sound.h"
  14. #include "../entry.h"
  15. #include "../SUB.H"
  16. #ifndef NULL
  17. #define NULL ((void *) 0)
  18. #endif
  19.  
  20. #define P_X    (*((short *) (&player[0].lx)))    /*lxの上位ワード*/
  21. #define P_Y    (*((short *) (&player[0].ly)))    /*lyの上位ワード*/
  22.  
  23. #define PALET_MAIN    0x0500
  24.  
  25. short enemy_explode( ENEMY *ene );
  26. static short MoveEnemyZako01(ENEMY *);
  27. /*static void TiniEnemyZako01(ENEMY *);*/
  28.  
  29. #define PT_ST    0x8
  30. #define PT_END    0x8+7
  31.  
  32. /* 16x16キャラの当たり判定 */
  33. extern HIT_XY4    hit8_p;
  34. extern HIT_XY4    hit8_o;
  35. extern HIT_XY4    hit8_s;
  36.  
  37. /* InitEnemyZako00Hitと同じなのでいらない */
  38. void InitEnemyZako01Hit( void )
  39. {
  40. }
  41.  
  42. void InitEnemyZako01(ENEMY *ene)
  43. {
  44.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  45.     ene->vx             = -2 * 65536;
  46.     ene->vy             = 0;
  47.     ene->hit_p[0]     = &hit8_p;ene->hit_p[1]=NULL;
  48.     ene->hit_o[0]     = &hit8_o;ene->hit_o[1]=NULL;
  49.     ene->hit_s[0]     = &hit8_s;ene->hit_s[1]=NULL;
  50.     ene->hp             = 1;
  51.     ene->no_dead     = 0;
  52.     ene->func_enemy_move = MoveEnemyZako01;
  53. /*    ene->func_enemy_tini = TiniEnemyZako01;*/
  54.  
  55. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  56. }
  57.  
  58.  
  59. static short MoveEnemyZako01( ENEMY *ene )
  60. {
  61.     unsigned char angle;
  62.  
  63.     short pt_st[3]={PT_ST,PT_ST,PT_ST+8};
  64.     short pt_end[3]={PT_END,PT_END,PT_END+8};
  65.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  66.     ene->x = ((ene->lx += ene->vx) >> 16)-8;    /*-8は表示位置をずらすため*/
  67.     ene->y = ((ene->ly += ene->vy) >> 16)-8;
  68.  
  69.     ene->pt = obj_zako+pt_st[ene->arg]+(ene->anim_count++)/4;
  70.     if( ene->pt > obj_zako+pt_end[ene->arg] ){
  71.         ene->pt = obj_zako+pt_st[ene->arg];
  72.         ene->anim_count=0;
  73.     }
  74.     switch (ene->state){
  75.     case 0:
  76.         switch (ene->arg){
  77.         case 0:
  78.         case 1:
  79.             /* 直角に折り返す */
  80.             if( ENE_X < 160 ){
  81.                 ene->vx=0;
  82.                 if( ene->arg )
  83.                     ene->vy=-2*65536;
  84.                 else
  85.                     ene->vy=2*65536;
  86.                 switch ( level ){
  87.                 case NOMAL:
  88.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  89.                     break;
  90.                 case HARD:
  91.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  92.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
  93.                     break;
  94.                 }
  95.                 ene->state++;
  96.             }
  97.             break;
  98.         case 2:
  99.             /* 斜めに折り返す */
  100.             if( ENE_X < 128 ){
  101.                 if( ENE_Y > 128 )
  102.                     ene->vy=-2*65536;
  103.                 else
  104.                     ene->vy=2*65536;
  105.                 switch ( level ){
  106.                 case EASY:
  107.                     break;
  108.                 case NOMAL:
  109.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  110.                     SetSE(SE_ESHOT_ENRG);    /* 敵ショット音 */
  111.                     break;
  112.                 case HARD:
  113.                     angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
  114.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
  115.                     MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
  116.                     SetSE(SE_ESHOT_ENRG);    /* 敵ショット音 */
  117.                     break;
  118.                 }
  119.                 ene->state++;
  120.             }
  121.         }
  122.         break;
  123.     case 1:
  124.         switch (ene->arg){
  125.         case 2:
  126.             ene->vx+=4096;
  127.             if( ene->vx > 2*65536 ){
  128.                 ene->vx = 2*65536;
  129.                 ene->state++;
  130.             }
  131.         }
  132.         break;
  133.     case 2:
  134.         /* 画面外に出たら消去 */
  135.         if( ENE_X > 255 + 24 || ENE_Y < 16 - 8 || ENE_Y > 255 + 24 )
  136.             return (0);
  137.     }
  138.  
  139.     /* ダメージを受けた時の処理 */
  140.     if(ene->damage){
  141.         MakeEffect(EFFECT_EXPLMINI, 0, ene->x, ene->y);
  142.         SetSE(SE_EXPL_S);    /* 爆発音 */
  143.         ene->player->score += 1;
  144.         return (0);        /* 消去 */
  145.     }
  146.  
  147.     xsp_set_st(ene);
  148.  
  149.     return(1);
  150. }
  151.  
  152. /*
  153. static void TiniEnemyZako01(ENEMY * p)
  154. {
  155. }
  156. */
  157.